package com.pic.mgt.scheduler;

import java.util.Date;
import java.util.List;
import java.util.Map;

public interface Scheduler {
	
	public static final String TRIGGER_INFO_NAME = "triggerName";
	public static final String TRIGGER_INFO_GROUP = "triggerGroup";
	public static final String TRIGGER_INFO_CRONEXPRESSION = "triggerCronExpression";
	public static final String TRIGGER_INFO_DESCRIPTION = "triggerDescription";

	/**
	 * 開始業務排程
	 */
	public void startScheduler() throws SchedulerException;

	/**
	 * 暫時業務排程
	 */
	public void haltScheduler();

	/**
	 * 關閉業務排程。一旦關閉排程則沒有辨法再 restart，必須重新初始化。
	 * 關閉業務排程會等待正在執行中的 Job 都已經執行完了，才會完成關閉。
	 */
	public void shutdownScheduler();

	/**
	 * 業務排程作業是否為暫停的狀態
	 */
	public boolean isHalted();

	/**
	 * 業務排程是否已停止
	 */
	public boolean isShutdown();

	/**
	 * 業務排程是否執行中
	 */
	public boolean isStarted();
	
	/**
	 * 暫停 Job排程
	 * @param jobName
	 * @param jobGroupName
	 * @throws SchedulerException
	 */
	public void pauseJob(String jobName, String jobGroupName) throws SchedulerException;
	
	/**
	 * 暫停 Job Group 排程 (屬於該 Group 的所有排程都會被暫停)
	 * @param jobGroupName
	 * @throws SchedulerException
	 */
	public void pauseJobGroup(String jobGroupName) throws SchedulerException;
	
	/**
	 * 恢復 Job 排程
	 * @param jobName
	 * @param jobGroupName
	 * @throws SchedulerException
	 */
	public void resumeJob(String jobName, String jobGroupName) throws SchedulerException;
	
	/**
	 * 恢復 Job Group 排程 (屬於該 Group 的所有排程都會被恢復)
	 * @param jobGroupName
	 * @throws SchedulerException
	 */
	public void resumeJobGroup(String jobGroupName) throws SchedulerException;
	
	/**
	 * 加入一個 Job 排程
	 * @param scheduleTime 排程執行時間
	 * @param jobName 不能為 null
	 * @param groupName 不能為 null
	 * @param className 不能為 null
	 * @param jobData 不能為 null
	 * @throws SchedulerException
	 */
	public void scheduleSimpleJob(Date scheduleTime,
								  String jobName,
								  String groupName,
								  Class className,
								  Map jobData) throws SchedulerException;
	
	/**
	 * 加入一個 Job 排程 (使用 Quartz Cron Expresstion)
	 * @param cronExpression 不能為 null
	 * @param jobName 不能為 null
	 * @param groupName 不能為 null
	 * @param jobDescription 可以為 null
	 * @param className 不能為 null
	 * @param jobData 不能為 null
	 * @throws SchedulerException
	 */
	public void scheduleCronJob(String cronExpression,
								String jobName,
								String groupName,
								String jobDescription,
								Class className,
								Map jobData) throws SchedulerException;
	
	public void rescheduleCronJob(String cronExpression,
								  String jobName,
								  String groupName,
								  String jobDescription) throws SchedulerException;
	
	/**
	 * 移除一個 Job 排程
	 * @param jobName
	 * @param groupName
	 * @throws SchedulerException
	 */
	public void removeJob(String jobName, String groupName) throws SchedulerException;
	
	/**
	 * 依照給定的 group name ,找出屬於該 group 的 job 資訊。
	 * @param groupName
	 * @return
	 * @throws SchedulerException
	 */
	public List<Map<String, Object>> getScheduleJobInfoByGroupName(String groupName) throws SchedulerException;
	
	/**
	 * 回傳 Job 的狀態
	 * @param jobName
	 * @param groupName
	 * @return　為 Quartz 的數值狀態，參考 Trigger.STATE_NORMAL, Trigger.STATE_PAUSED, Trigger.STATE_COMPLETE, Trigger.STATE_ERROR, Trigger.STATE_BLOCKED, Trigger.STATE_NONE
	 * @throws SchedulerException
	 */
	public int getJobStatus(String jobName, String groupName) throws SchedulerException;
	
	/**
	 * 將 Schedle 的資訊格式化後回傳
	 * @param jobInfoMapList
	 * @return
	 */
	public String formatSchedules(List<Map<String, Object>> jobInfoMapList) throws SchedulerException;
	
}